package main

import (
	"fmt"
	"strings"
	"函数/funcs" //这里的funcs是文件夹名称
) 

var num = 90	//全局变量定义先执行
var(	//全局匿名函数
	func1 = func(a int ,b int) int {
		return a*b
	}
)

func init(){	//在全局变量之前执行main函数之前执行 初始化工作
	fmt.Println("init函数...",num)
}

func noName(){	//匿名函数的使用
	//1 只调用一次
	res1 := func(a int,b int)int{
		return a+b
	}(10,20)
	fmt.Println("匿名函数1的值:",res1)
	//2 此时a的数据类型就是函数类型(多次调用)
	res2 := func(a int,b int) int{
		return b-a
	}
	fmt.Println("匿名函数2的值:",res2(10,20))
}

//返回的匿名函数和isSuffix中的suffix变量构成闭包
func isSuffix(suffix string) func (string) string{		//闭包的使用
	return func (name string) string{
		if(!strings.HasSuffix(name,suffix)){
			return name+suffix
		}
		return name
	}
}

func sum(a int ,b int) int {
	//使用defer修饰的语句会将语句中的值也拷贝到栈中，后续函数中对语句中变量的修改不会影响到变量的值
	defer fmt.Println("a = ",a)	//3函数执行完成后执行defer修饰的语句
	defer fmt.Println("b = ",b)	//2defer修饰的语句存在栈中，先进先出的原则
	a++
	b++	//不会改变defer语句中输出的a,b的值
	fmt.Println("函数返回")		//1
	return a+b
}

func main(){
	var result int 
	var result2 int
	result, result2 = funcs.Model2(3,5)
	funcs.Model1()	//这里的funcs是文件中定义的package后的名称
	fmt.Println(result,result2)

	noName()	//匿名函数
	fmt.Println(func1(2,4))	//全局函数

	f1 := isSuffix(".jpg")	//闭包的使用
	fmt.Println("加工后的字符串为:",f1("hello"))

	res := sum(10,30)
	fmt.Println("sum = ",res)	//4
}